#include "stm32f10x.h"                  // Device header
#include "stdio.h"

uint8_t Serial_TxPacket[4];
uint8_t Serial_RxPacket[100];
uint8_t Serial_RxFlag;
void Serial_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate=9600;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
    USART_InitStructure.USART_Parity=USART_Parity_No;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    USART_Init(USART1,&USART_InitStructure);
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_Cmd(USART1,ENABLE);
}

void Serial_SendByte(uint8_t Byte){
    USART_SendData(USART1,Byte);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}

void Serial_SendArray(uint8_t *Array,uint16_t Length){
    uint16_t i;
    for(i=0;i<Length;i++){
        Serial_SendByte(Array[i]);
    }
}

void Serial_SendString(char *String){
    uint8_t i;
    for(i=0;String[i]!='\0';i++){
        Serial_SendByte(String[i]);
    }
}

uint32_t Serial_Pow(uint32_t x,uint32_t y){
    uint32_t Result=1;
    while(y--){
        Result*=x;
    }
    return Result;
}

void Serial_SendNumber(uint32_t Number,uint8_t Length){
    uint8_t i;
    for(i=0;i<Length;i++){
        Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');
    }
}

int fputc(int ch,FILE *f){
    Serial_SendByte(ch);
    return ch;
}




void USART1_IRQHandler(void){
    static uint8_t RxState = 0;
    static uint8_t pRxPacket = 0;
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET){
        uint8_t RxData = USART_ReceiveData(USART1); // 读取接收数据
        
        if(RxState == 0){
            // 状态0：等待帧头0xFF
            if(RxData == '@'&&Serial_RxFlag==0){
                RxState = 1;
                pRxPacket = 0;
            }
        }
        else if(RxState == 1){
            // 状态1：接收数据
			
			if(RxData=='\r'){
				RxState=2;
			}else{
				  Serial_RxPacket[pRxPacket] = RxData;
				  pRxPacket++;
            
			}
          
        
        }
        else if(RxState == 2){
            // 状态2：等待帧尾0xFE
            if(RxData == '\n'){
                RxState = 0;
				Serial_RxPacket[pRxPacket]='\0';
                Serial_RxFlag = 1; // 标记接收完成
            }
//            else{
//                // 如果没有收到帧尾，重置状态机
//                RxState = 0;
//            }
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}